Day06 general skill 的三星題目已經更新上去了,有興趣的可以去看看~
又是一題電腦太慢的問題,直接用ghidra打開吧
整個程式的架構跟前兩題沒什麼不同,一樣是三秒會觸發alarm,唯一不同的是calculate_key當中所呼叫的函式不一樣
提示也說我們要如何加速這種一直做重複動作的運算呢
這邊運用Dynamic Programming的概念,這邊寫了一個C的程式來運行這段程式碼
#include <stdio.h>
#define SIZE 0x18e28
unsigned int result[SIZE];
int check[SIZE];
unsigned int cal(unsigned int x){
unsigned int var1,var2,var3,var4,var5,num;
if(check[x])
return result[x];
if(x<5)
num=x*x+0x2345;
else{
var1 = cal(x-1);
var2 = cal(x-2);
var3 = cal(x-3);
var4 = cal(x-4);
var5 = cal(x-5);
num = var5*0x1234 + (var1-var2) + (var3-var4);
}
check[x] = 1;
result[x]=num;
return num;
}
int main(){
printf("%u",cal(SIZE));
}
可以得出結果為 4180374238
接著在使用上次的方法將前面的呼叫函式透過hexeditor轉成nop,在print_flag之前更改暫存器的值
更改完後再透過gdb查看,有成功更改成nop就可以繼續了
接著看看print_flag的組合語言碼
在print_flag+20的地方將eax的值改成我們剛剛計算出來的結果
其實有時候解ctf的題目也是考驗寫程式的能力,看到這flag的確是利用Dynamic programming的方式來解這題,不過這題也算是蠻容易的題目,畢竟picoCTF本來就算是入門的CTF